package dialect

import (
	"fmt"
	"reflect"
	"time"
)

//sqlite3 框架默认为sqlite数据库提供的方言
type sqlite3 struct{}

//确保sqlite3实现了Dialect接口,否则此行代码再编译器就会报错
var _ Dialect = (*sqlite3)(nil)

//init 导入包后,会默认注册当前数据库的方言
func init() {
	RegisterDialect("sqlite3", &sqlite3{})
}

//DataTypeOf 将go数据类型转换为sqlite中的数据类型
func (s *sqlite3) DataTypeOf(typ reflect.Value) string {
	switch typ.Kind() {
	case reflect.Bool:
		return "bool"
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr:
		return "integer"
	case reflect.Int64, reflect.Uint64:
		return "bigint"
	case reflect.Float32, reflect.Float64:
		return "real"
	case reflect.String:
		return "text"
	case reflect.Array, reflect.Slice:
		return "blob"
	case reflect.Struct:
		//获取反射对象的接口值,尝试转换为Time,如果成功说明是Time类型
		if _, ok := typ.Interface().(time.Time); ok {
			return "datetime"
		}
	}
	panic(fmt.Sprintf("invalid sql type %s (%s)", typ.Type().Name(), typ.Kind()))
}

func (s *sqlite3) TableExistSQL(tableName string) (string, []interface{}) {
	args := []interface{}{tableName}
	return "SELECT name FROM sqlite_master WHERE type='table' and name = ?", args
}
